package pl.elka.pszt.model;

import pl.elka.pszt.model.literal.Literal;

/**
 * Element bazy wiedzy. Moze to byc klauzula koniunkcyjno-implikacyjna lub tez
 * fakt.
 * 
 * @author Andrzej Makarewicz
 * 
 */
public abstract class KnowledgeElement {
	
	public enum Type {
		CLAUSE, FACT
	};
	
	final Literal conclusion;
	final Type type;
	
	public KnowledgeElement(Literal conclusion, Type type) {
		if (conclusion == null || type == null) throw new NullPointerException();
		
		this.conclusion = conclusion;
		this.type = type;
	}
	
	/**
	 * 
	 * @return literal bedacy konkluzja danego elementu wiedzy (dla faktu
	 *         literal bedacy tymze faktem)
	 */
	public Literal getConclusion() {
		return conclusion;
	}
	
	public Type getType() {
		return type;
	}
	
	/**
	 * 
	 * @return czy jest faktem
	 */
	public boolean isFact() {
		return type == Type.FACT;
	}
	
	/**
	 * 
	 * @return czy jest klauzula koniunkcyjno-implikacyjna
	 */
	public boolean isClause() {
		return type == Type.CLAUSE;
	}
	
	@Override
	public String toString() {
		return conclusion.toString();
	}
	
}
